Guided Practice

For this section, we are going to use a Rnotebook, which mix both markdwon formatted text and code. We can easily compile the output as a report in .html format to share with others.

We are going to build some cool visualizations using what we talked in the previous section, and this will be the base for the shiny apps in next section.

First of all, we need to load some libraries.

library(tidyverse)
library(gapminder)
library(palmerpenguins)
library(countrycode)
library(ggrepel)
library(plotly)
library(ggthemes)
library(gridExtra)
library(scales)
library(ggridges)

Penguins

penguins %>% 
  filter(!is.na(sex)) %>% 
ggplot(., aes(x= bill_length_mm, y = sex, fill=species)) + 
  geom_density_ridges(alpha=0.5)+
  theme_minimal()+
  scale_fill_viridis_d(na.translate = FALSE)+
  facet_grid(species~.)

penguins %>% 
  filter(!is.na(sex)) %>% 
ggplot(., aes(x = bill_length_mm, y = sex,fill = factor(stat(quantile)))) +
  stat_density_ridges(
    geom = "density_ridges_gradient", calc_ecdf = TRUE,
    quantiles = 4, quantile_lines = TRUE,
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1) +
  scale_fill_viridis_d(name = "Quartiles")+
    theme_minimal()+
  facet_grid(species~.)+
  theme(legend.position = 'bottom')

p1 <- penguins %>% 
  filter(!is.na(sex)) %>% 
ggplot(., aes(x = bill_length_mm, y = sex,fill = factor(stat(quantile)))) +
  stat_density_ridges(
    geom = "density_ridges_gradient", calc_ecdf = TRUE,
    quantiles = 4, quantile_lines = TRUE,
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1) +
  scale_fill_viridis_d(name = "Quartiles")+
    theme_fivethirtyeight()+
  theme(legend.position = 'none')+
  labs(title = 'Bill lenght') + 
  facet_grid(species~.)

p2 <- penguins %>% 
  filter(!is.na(sex)) %>% 
ggplot(., aes(x = bill_depth_mm, y = sex,fill = factor(stat(quantile)))) +
  stat_density_ridges(
    geom = "density_ridges_gradient", calc_ecdf = TRUE,
    quantiles = 4, quantile_lines = TRUE,
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1) +
  scale_fill_viridis_d(name = "Quartiles")+
    theme_fivethirtyeight()+
  labs(title = 'Bill depth') + 
  facet_grid(species~.)


grid.arrange(p1,p2)

or another way would be to use facet_grid

penguins %>% 
  filter(!is.na(sex)) %>%
  pivot_longer(cols = bill_length_mm:bill_depth_mm, names_pattern =  'bill_(.*)_mm') %>% 
ggplot(., aes(x = value, y = sex,fill = factor(stat(quantile)))) +
  stat_density_ridges(
    geom = "density_ridges_gradient", calc_ecdf = TRUE,
    quantiles = 4, quantile_lines = TRUE,
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1) +
  scale_fill_viridis_d(name = "Quartiles")+
    theme_hc()+
  labs(title = 'Bill size') + 
  facet_grid(species~name, scales = 'free')

Gapminder

Let’s see the Ratio girls/boys in school, primary and secondary education (%)

ratio_girls_education <- read_csv("../data/ratio_of_girls_to_boys_in_primary_and_secondary_education_perc.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  country = col_character()
)
See spec(...) for full column specifications.
ratio_girls_education

let’s clean a little the data before we visualize it

ratio_girls_education <- ratio_girls_education %>% 
  pivot_longer(cols = -country,values_drop_na = TRUE, names_to = 'year', values_to = 'ratio') %>% 
    mutate(year = as.integer(year),
         country = as_factor(country),
         continent =  countrycode(sourcevar = country,
                            origin = "country.name",
                            destination = "continent")) %>% 
  left_join(gapminder_unfiltered, by = c("country", "year", "continent"))

We can plot one year

ratio_girls_education %>%
  filter(!is.na(lifeExp)) %>% 
  filter(year==2007) %>% 
  ggplot(aes(gdpPercap, ratio, color=continent,size=pop)) +
  geom_point()+
  annotate("rect", xmin=0, xmax=5000, ymin=-Inf, ymax=Inf, alpha=0.2, color="blue", fill="blue")+
  annotate("text", x = 13000, y = 0.7, label = "GDP per capita <5000")+
  theme_minimal()

plt <- ratio_girls_education %>%
  filter(!is.na(lifeExp)) %>% 
  filter(year==2007) %>% 
  ggplot(aes(gdpPercap, ratio, color=continent,size=pop, text = paste(country,
                                                                      '<br>GDP per capita: ',number(gdpPercap, 1),
                                                                      '<br>Population: ', number(pop/10000,1),'M',
                                                                      '<br>ratio: ',ratio))) +
  geom_point()+
  scale_y_continuous(labels= percent)+
  theme_minimal()


ggplotly(plt, tooltip = 'text')

Independent practice

Now design a plot yourselves!

  1. Take a couple of minutes for selecting the dataset
  2. Try to select an easy dataset (without too much pre-preprossesing), so you can try different visualizations of the data.

You can use any dataset you want, for example:

LS0tCnRpdGxlOiAiRGF0YVZpeiIKc3VidGl0bGU6ICdQcmFjdGljZScKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKZGF0ZTogIiIKLS0tCgojIEd1aWRlZCBQcmFjdGljZQoKRm9yIHRoaXMgc2VjdGlvbiwgd2UgYXJlIGdvaW5nIHRvIHVzZSBhICpSbm90ZWJvb2sqLCB3aGljaCBtaXggYm90aCBtYXJrZHdvbiBmb3JtYXR0ZWQgdGV4dCBhbmQgY29kZS4gV2UgY2FuIGVhc2lseSBjb21waWxlIHRoZSBvdXRwdXQgYXMgYSByZXBvcnQgaW4gLmh0bWwgZm9ybWF0IHRvIHNoYXJlIHdpdGggb3RoZXJzLgoKV2UgYXJlIGdvaW5nIHRvIGJ1aWxkIHNvbWUgY29vbCB2aXN1YWxpemF0aW9ucyB1c2luZyB3aGF0IHdlIHRhbGtlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgYW5kIHRoaXMgd2lsbCBiZSB0aGUgYmFzZSBmb3IgdGhlIHNoaW55IGFwcHMgaW4gbmV4dCBzZWN0aW9uLgoKRmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgc29tZSBsaWJyYXJpZXMuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnYXBtaW5kZXIpCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpCmxpYnJhcnkoY291bnRyeWNvZGUpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShnZ3JpZGdlcykKYGBgCgojIyBQZW5ndWlucwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGVuZ3VpbnMgJT4lIAogIGZpbHRlcighaXMubmEoc2V4KSkgJT4lIApnZ3Bsb3QoLiwgYWVzKHg9IGJpbGxfbGVuZ3RoX21tLCB5ID0gc2V4LCBmaWxsPXNwZWNpZXMpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGE9MC41KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QobmEudHJhbnNsYXRlID0gRkFMU0UpKwogIGZhY2V0X2dyaWQoc3BlY2llc34uKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CnBlbmd1aW5zICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNleCkpICU+JSAKZ2dwbG90KC4sIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBzZXgsZmlsbCA9IGZhY3RvcihzdGF0KHF1YW50aWxlKSkpKSArCiAgc3RhdF9kZW5zaXR5X3JpZGdlcygKICAgIGdlb20gPSAiZGVuc2l0eV9yaWRnZXNfZ3JhZGllbnQiLCBjYWxjX2VjZGYgPSBUUlVFLAogICAgcXVhbnRpbGVzID0gNCwgcXVhbnRpbGVfbGluZXMgPSBUUlVFLAogICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDApLAogICAgcG9pbnRfc2hhcGUgPSAnfCcsIHBvaW50X3NpemUgPSAzLCBwb2ludF9hbHBoYSA9IDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIlF1YXJ0aWxlcyIpKwogICAgdGhlbWVfbWluaW1hbCgpKwogIGZhY2V0X2dyaWQoc3BlY2llc34uKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTV9CnAxIDwtIHBlbmd1aW5zICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNleCkpICU+JSAKZ2dwbG90KC4sIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBzZXgsZmlsbCA9IGZhY3RvcihzdGF0KHF1YW50aWxlKSkpKSArCiAgc3RhdF9kZW5zaXR5X3JpZGdlcygKICAgIGdlb20gPSAiZGVuc2l0eV9yaWRnZXNfZ3JhZGllbnQiLCBjYWxjX2VjZGYgPSBUUlVFLAogICAgcXVhbnRpbGVzID0gNCwgcXVhbnRpbGVfbGluZXMgPSBUUlVFLAogICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDApLAogICAgcG9pbnRfc2hhcGUgPSAnfCcsIHBvaW50X3NpemUgPSAzLCBwb2ludF9hbHBoYSA9IDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIlF1YXJ0aWxlcyIpKwogICAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSsKICBsYWJzKHRpdGxlID0gJ0JpbGwgbGVuZ2h0JykgKyAKICBmYWNldF9ncmlkKHNwZWNpZXN+LikKCnAyIDwtIHBlbmd1aW5zICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNleCkpICU+JSAKZ2dwbG90KC4sIGFlcyh4ID0gYmlsbF9kZXB0aF9tbSwgeSA9IHNleCxmaWxsID0gZmFjdG9yKHN0YXQocXVhbnRpbGUpKSkpICsKICBzdGF0X2RlbnNpdHlfcmlkZ2VzKAogICAgZ2VvbSA9ICJkZW5zaXR5X3JpZGdlc19ncmFkaWVudCIsIGNhbGNfZWNkZiA9IFRSVUUsCiAgICBxdWFudGlsZXMgPSA0LCBxdWFudGlsZV9saW5lcyA9IFRSVUUsCiAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wNSwgaGVpZ2h0ID0gMCksCiAgICBwb2ludF9zaGFwZSA9ICd8JywgcG9pbnRfc2l6ZSA9IDMsIHBvaW50X2FscGhhID0gMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiUXVhcnRpbGVzIikrCiAgICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSsKICBsYWJzKHRpdGxlID0gJ0JpbGwgZGVwdGgnKSArIAogIGZhY2V0X2dyaWQoc3BlY2llc34uKQoKCmdyaWQuYXJyYW5nZShwMSxwMikKCmBgYAoKb3IgYW5vdGhlciB3YXkgd291bGQgYmUgdG8gdXNlIGZhY2V0X2dyaWQKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD00fQpwZW5ndWlucyAlPiUgCiAgZmlsdGVyKCFpcy5uYShzZXgpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGJpbGxfbGVuZ3RoX21tOmJpbGxfZGVwdGhfbW0sIG5hbWVzX3BhdHRlcm4gPSAgJ2JpbGxfKC4qKV9tbScpICU+JSAKZ2dwbG90KC4sIGFlcyh4ID0gdmFsdWUsIHkgPSBzZXgsZmlsbCA9IGZhY3RvcihzdGF0KHF1YW50aWxlKSkpKSArCiAgc3RhdF9kZW5zaXR5X3JpZGdlcygKICAgIGdlb20gPSAiZGVuc2l0eV9yaWRnZXNfZ3JhZGllbnQiLCBjYWxjX2VjZGYgPSBUUlVFLAogICAgcXVhbnRpbGVzID0gNCwgcXVhbnRpbGVfbGluZXMgPSBUUlVFLAogICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDApLAogICAgcG9pbnRfc2hhcGUgPSAnfCcsIHBvaW50X3NpemUgPSAzLCBwb2ludF9hbHBoYSA9IDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIlF1YXJ0aWxlcyIpKwogICAgdGhlbWVfaGMoKSsKICBsYWJzKHRpdGxlID0gJ0JpbGwgc2l6ZScpICsgCiAgZmFjZXRfZ3JpZChzcGVjaWVzfm5hbWUsIHNjYWxlcyA9ICdmcmVlJykKYGBgCgojIyBHYXBtaW5kZXIKCkxldCdzIHNlZSB0aGUgW1JhdGlvIGdpcmxzL2JveXMgaW4gc2Nob29sLCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZWR1Y2F0aW9uICglKV0oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLkVOUi5QUlNDLkZNLlpTKQoKYGBge3J9CnJhdGlvX2dpcmxzX2VkdWNhdGlvbiA8LSByZWFkX2NzdigiLi4vZGF0YS9yYXRpb19vZl9naXJsc190b19ib3lzX2luX3ByaW1hcnlfYW5kX3NlY29uZGFyeV9lZHVjYXRpb25fcGVyYy5jc3YiKQpyYXRpb19naXJsc19lZHVjYXRpb24KYGBgCgpsZXQncyBjbGVhbiBhIGxpdHRsZSB0aGUgZGF0YSBiZWZvcmUgd2UgdmlzdWFsaXplIGl0CgpgYGB7cn0KcmF0aW9fZ2lybHNfZWR1Y2F0aW9uIDwtIHJhdGlvX2dpcmxzX2VkdWNhdGlvbiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSx2YWx1ZXNfZHJvcF9uYSA9IFRSVUUsIG5hbWVzX3RvID0gJ3llYXInLCB2YWx1ZXNfdG8gPSAncmF0aW8nKSAlPiUgCiAgICBtdXRhdGUoeWVhciA9IGFzLmludGVnZXIoeWVhciksCiAgICAgICAgIGNvdW50cnkgPSBhc19mYWN0b3IoY291bnRyeSksCiAgICAgICAgIGNvbnRpbmVudCA9ICBjb3VudHJ5Y29kZShzb3VyY2V2YXIgPSBjb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luID0gImNvdW50cnkubmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiA9ICJjb250aW5lbnQiKSkgJT4lIAogIGxlZnRfam9pbihnYXBtaW5kZXJfdW5maWx0ZXJlZCwgYnkgPSBjKCJjb3VudHJ5IiwgInllYXIiLCAiY29udGluZW50IikpCmBgYAoKV2UgY2FuIHBsb3Qgb25lIHllYXIKCmBgYHtyfQpyYXRpb19naXJsc19lZHVjYXRpb24gJT4lCiAgZmlsdGVyKCFpcy5uYShsaWZlRXhwKSkgJT4lIAogIGZpbHRlcih5ZWFyPT0yMDA3KSAlPiUgCiAgZ2dwbG90KGFlcyhnZHBQZXJjYXAsIHJhdGlvLCBjb2xvcj1jb250aW5lbnQsc2l6ZT1wb3ApKSArCiAgZ2VvbV9wb2ludCgpKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbj0wLCB4bWF4PTUwMDAsIHltaW49LUluZiwgeW1heD1JbmYsIGFscGhhPTAuMiwgY29sb3I9ImJsdWUiLCBmaWxsPSJibHVlIikrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTMwMDAsIHkgPSAwLjcsIGxhYmVsID0gIkdEUCBwZXIgY2FwaXRhIDw1MDAwIikrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGx0IDwtIHJhdGlvX2dpcmxzX2VkdWNhdGlvbiAlPiUKICBmaWx0ZXIoIWlzLm5hKGxpZmVFeHApKSAlPiUgCiAgZmlsdGVyKHllYXI9PTIwMDcpICU+JSAKICBnZ3Bsb3QoYWVzKGdkcFBlcmNhcCwgcmF0aW8sIGNvbG9yPWNvbnRpbmVudCxzaXplPXBvcCwgdGV4dCA9IHBhc3RlKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPkdEUCBwZXIgY2FwaXRhOiAnLG51bWJlcihnZHBQZXJjYXAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj5Qb3B1bGF0aW9uOiAnLCBudW1iZXIocG9wLzEwMDAwLDEpLCdNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+cmF0aW86ICcscmF0aW8pKSkgKwogIGdlb21fcG9pbnQoKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPSBwZXJjZW50KSsKICB0aGVtZV9taW5pbWFsKCkKCgpnZ3Bsb3RseShwbHQsIHRvb2x0aXAgPSAndGV4dCcpCmBgYAoKIyBJbmRlcGVuZGVudCBwcmFjdGljZQoKTm93IGRlc2lnbiBhIHBsb3QgeW91cnNlbHZlcyEKCjEuICBUYWtlIGEgY291cGxlIG9mIG1pbnV0ZXMgZm9yIHNlbGVjdGluZyB0aGUgZGF0YXNldAoyLiAgVHJ5IHRvIHNlbGVjdCBhbiBlYXN5IGRhdGFzZXQgKHdpdGhvdXQgdG9vIG11Y2ggcHJlLXByZXByb3NzZXNpbmcpLCBzbyB5b3UgY2FuIHRyeSBkaWZmZXJlbnQgdmlzdWFsaXphdGlvbnMgb2YgdGhlIGRhdGEuCgpZb3UgY2FuIHVzZSBhbnkgZGF0YXNldCB5b3Ugd2FudCwgZm9yIGV4YW1wbGU6CgotICAgb3RoZXIgZGF0YSBmcm9tIGdhcG1pbmRlciA8aHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLz4KCi0gICBbdGlkeXR1ZXNkYXldKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkpIGlzIGEgcHJvamVjdCBmb3IgZGF0YXZpeiB0aGF0IHBvc3QgYSBuZXcgZGF0YXNldCBldmVyeSB3ZWVrIHNpbmNlIDIwMTguCgotICAgRGF0YSBmcm9tIHlvdXIgb3duIHJlc2VhcmNoIChpZGVhbGx5KQo=